﻿//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Licensed under the MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////
#include "GbmpParameterStandardValueList.h"

#include "IParameterDefinitionLibrary.h"
#include "IParameterDefinition.h"
#include "IParameterValueString.h"
#include "IStandardCodeSystemProxy.h"
#include "IStandardCodeItem.h"
#include "IStandardCodeValueListRange.h"
#include "EnableCompileWarning_The_LAST_IncludeInCpp.h"


using namespace gcmp;

DATA_DEFINE(GbmpParameterStandardValueList)
{
}

gcmp::GbmpParameterStandardValueList::GbmpParameterStandardValueList(const UniIdentity& uid) :
    GbmpParameterValueListBase(uid)
{
}

OwnerPtr<IParameterValueList> gcmp::GbmpParameterStandardValueList::Clone() const
{
    return NEW_AS_OWNER_PTR(GbmpParameterStandardValueList, *this);
}

std::wstring gcmp::GbmpParameterStandardValueList::OnGetDisplayStringByValue( const IDocument* pDoc, const IParameterValueStorage* pValue ) const
{
    std::wstring res;

    if (pValue == nullptr)
    {
        return res;
    }

    if (const IParameterValueString* pPVSString = quick_cast<const IParameterValueString>(pValue))
    {
        const std::wstring& code = pPVSString->GetValue();
        if (const IStandardCodeItem* codeItem = IStandardCodeSystemProxy::Get()->GetStandardCodeItemByCode(code))
        {
            res = codeItem->GetCodeName();
        }
    }

    return res;
}

std::vector<OwnerPtr<IParameterValueStorage>> gcmp::GbmpParameterStandardValueList::OnGetValues(const IDocument* pDoc, const std::vector<ElementId>& ids/* = std::vector<ElementId>()*/) const
{
    std::vector<OwnerPtr<IParameterValueStorage>> res;

    const UniIdentity& paramDefUid = GetUid();
    const IParameterDefinition* pDef = IParameterDefinitionLibrary::Get(pDoc)->GetParameterDefinitionByUid(paramDefUid);

    if (pDef == nullptr)
    {
        return res;
    }

    const std::wstring& code = pDef->GetStandardCode();

    const IStandardCodeItem* codeItem = IStandardCodeSystemProxy::Get()->GetStandardCodeItemByCode(code);
    if (codeItem == nullptr)
    {
        return res;
    }

    const IStandardCodeValueRange* pCodeValueRange = codeItem->GetStandardCodeValueRange();
    if (pCodeValueRange && pCodeValueRange->GetCodeValueRangeType() == StandardCodeValueRangeType::List)
    {
        const IStandardCodeValueListRange* pCodeValueDiscreteRange = dynamic_cast<const IStandardCodeValueListRange*>(pCodeValueRange);
        DBG_WARN_AND_RETURN_UNLESS(pCodeValueDiscreteRange, res, L"找不到对应的值域",L"GDMPLab",L"2024-03-30");
        const std::vector<std::wstring>& valueList = pCodeValueDiscreteRange->GetValue();
        FOR_EACH(item, valueList)
        {
            OwnerPtr<IParameterValueStorage>  opParameterValueStorage = IParameterValueString::Create(item);
            res.push_back(TransferOwnership(opParameterValueStorage));// enumCodeItem->GetCode()));//->GetCodeName()
        }
    }
    return res;
}

